package cn.yunyichina.provider.hisiface.util;

import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.Map;

import cn.yunyichina.provider.hisiface.sdk.security.Base64Method;
import cn.yunyichina.provider.hisiface.sdk.util.MD5Utils;
import cn.yunyichina.provider.hisiface.sdk.util.MapUtils;
import cn.yunyichina.provider.hisiface.sdk.util.TimeUtils;
import cn.yunyichina.utils.network.HttpsUtil;

/**
 * 请求前置机
 * 
 * @author zhou
 *
 */
public class HttpUtils {
	
	/**
	 * 参数加密，生成签名
	 * 
	 * @param url 前置机的服务地址
	 * @param signKey 前置机生成签名的key
	 * @param method 前置机提供的接口名
	 * @param jsonContent 参数
	 * @return
	 * @throws Exception
	 */
	public static String doSslPost(String url, String signKey, String sessionId, String method, String jsonContent) throws Exception {
	
		try {
			String timestamp = TimeUtils.getTime();
			// base64加密，主要解决乱码的问题
			String data = Base64Method.encryptUrlSafeBase64(jsonContent);
			
			Map<String, String> map = new HashMap<>();
			map.put("timestamp", timestamp);
			map.put("data", data);
			map.put("method", method);
			map.put("sessionid", sessionId);
			
			String encryptStr = MapUtils.coverMap2SignString(map);
			String sign = MD5Utils.string2MD5(encryptStr + signKey);
			
			map.put("sign", sign);
			
			String httpContent = MapUtils.coverMap2String(map);
			return HttpsUtil.doSslPost(url, httpContent, "utf-8");
		} catch (Exception e) {
			// 接受响应超时，不知道his处理结果，异常
			if (e instanceof SocketTimeoutException) {
				throw e;
			}
			
			// 其他都当失败
			throw new PostFailureException("请求前置机失败", e);
		}
		
	}

}
